package com.szs.controller;

import com.szs.common.R;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.util.UUID;

/**
 * 文件上传和下载
 */
@Slf4j
@RestController
@RequestMapping("/common")
public class CommonController {

    @Value("${reggie.path}")
    private String basePath;

    @PostMapping("/upload")
    public R<String> upload(MultipartFile file) {

        // file最开始会存放在一个临时文件中
        log.info("file" + file.toString());
        String fileName;
        if (!file.isEmpty()) {
            // 获取原始的文件名
            String originalFilename = file.getOriginalFilename();

            // 获取文件名后缀
            String suffix = originalFilename.
                    substring(originalFilename.lastIndexOf("."));

            // 使用UUID重新生成文件名
            fileName = UUID.randomUUID().toString() + suffix;

            log.info("新生成的文件名：{}", fileName);

            // 创建目录对象
            File uploadFile = new File(basePath);
            // 判断目录是否存在
            if (!uploadFile.exists())
                // 目录不存在，则新建一个
                uploadFile.mkdirs();

            try {
                file.transferTo(new File(basePath, fileName));
            } catch (IOException e) {
                e.printStackTrace();
                return R.error("上传失败");
            }
        } else {
            return R.error("请选择上传的文件");
        }
        return R.success(fileName);
    }

    /**
     * 文件下载
     *
     * @param name
     * @param response
     */
    @GetMapping("/download")
    public void download(String name, HttpServletResponse response) {

        log.info("获取的文件名：{}", name);

        try {
            // 创建文件输入流对象读取文件
            FileInputStream inputStream = new FileInputStream(new File(basePath, name));

            // 创建文件输出流对象，将文件写回浏览器
            ServletOutputStream outputStream = response.getOutputStream();

            response.setContentType("image/jpg");

            // 定义一个byte数组接收字节数据
            byte[] bytes = new byte[1024];

            while (inputStream.read(bytes) != -1) {
                outputStream.write(bytes, 0, bytes.length);
                outputStream.flush();
            }
            // 关闭资源
            outputStream.close();
            inputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
